class HuiRuiRequest {

  options = {
    // 请求基地址
    baseURL: "http://192.168.137.1:8080/api",
    timeout: 10000
  }

  /**
   *  构建查询参数
   */
  #buildQueryParams(params) {
    const queryParts = [];
    for (const key in params) {
      const value = params[key];
      if (Array.isArray(value)) {
        value.forEach(item => {
          const encodedKey = encodeURIComponent(key);
          const encodedItem = encodeURIComponent(item);
          queryParts.push(`${encodedKey}=${encodedItem}`);
        });
      } else {
        const encodedKey = encodeURIComponent(key);
        const encodedValue = encodeURIComponent(value);
        queryParts.push(`${encodedKey}=${encodedValue}`);
      }
    }
    if (queryParts.length === 0) {
      return ''
    } else {
      return queryParts.join('&');
    }
  }

  #query(url, method, params, data) {
    const queryParams = this.#buildQueryParams(params)
    const finalUrl = this.options.baseURL + (url || '') + (queryParams ? `?${queryParams}` : '');
    const token = wx.getStorageSync('token')
    const header = {
      'Content-Type': 'application/json',
    }
    // 请求之前发送Token
    if (token) {
      header.token = token
    }
    return new Promise((resolve, reject) => {
      wx.request({
        // 请求路径
        url: finalUrl,
        // 请求方法
        method,
        // 请求超时时间
        timeout: this.options.timeout,
        // 请求头
        header,
        // 请求数据
        data: data || {},
        success(res) {
          if (res.statusCode === 200) {
            res = res.data
            resolve(res)
          } else if (res.statusCode === 401) {
            wx.clearStorageSync()
            wx.showModal({
              title: '提示',
              content: '请登录',
              showCancel: false,
              success: () => {
                wx.reLaunch({
                  url: '/pages/LoginPage/LoginPage'
                })
                resolve("跳转登录页面")
              }
            });
          } else {
            reject(res)
          }
        },
        fail(err) {
          reject({
            message: "服务器无法连接",
            error: err
          });
        }
      })
    })
  }

  /**
   * 发送 GET 请求
   * @param {string} url - 请求接口地址（相对于baseURL）
   * @param {Object} [params] - URL查询参数
   * @returns {Promise} 请求结果的Promise对象
   */
  get(url, params) {
    return this.#query(url, "GET", params)
  }

  /**
   * 发送 POST 请求
   * @param {string} url - 请求接口地址（相对于baseURL）
   * @param {Object} [params] - URL查询参数
   * @param {Object} [data] - 请求体数据（JSON格式）
   * @returns {Promise} 请求结果的Promise对象
   */
  post(url, params, data) {
    return this.#query(url, "POST", params, data)
  }

  /**
   * 发送 DELETE 请求
   * @param {string} url - 请求接口地址（相对于baseURL）
   * @param {Object} [params] - URL查询参数
   * @param {Object} [data] - 请求体数据（JSON格式）
   * @returns {Promise} 请求结果的Promise对象
   */
  delete(url, params, data) {
    return this.#query(url, "DELETE", params, data)
  }

  /**
   * 发送 PUT 请求
   * @param {string} url - 请求接口地址（相对于baseURL）
   * @param {Object} [params] - URL查询参数
   * @param {Object} [data] - 请求体数据（JSON格式）
   * @returns {Promise} 请求结果的Promise对象
   */
  put(url, params, data) {
    return this.#query(url, "PUT", params, data)
  }

  /**
   * 发送 PATCH 请求
   * @param {string} url - 请求接口地址（相对于baseURL）
   * @param {Object} [params] - URL查询参数
   * @param {Object} [data] - 请求体数据（JSON格式）
   * @returns {Promise} 请求结果的Promise对象
   */
  patch(url, params, data) {
    return this.#query(url, "PATCH", params, data)
  }
}

const request = new HuiRuiRequest()

export default request;